package com.itheima.d13_stringBuilder;


/**
 * StringBuilder代表可变字符串对象，相当于是一个容器，它里面装的字符串是可以改变的，就是用来操作字符串的。
 * 好处：StringBuilder比String更适合做字符串的修改操作，效率会更高，代码也会更简洁。
 *
 * 构造器                                       说明
 * public StringBuilder()               创建一个空白的可变的字符串对象，不包含任何内容
 * public StringBuilder(String str)     创建一个指定字符串内容的可变字符串对象
 *
 * 方法名称                                   说明
 * public StringBuilder append(任意类型）  添加数据并返回StringBuilder对象本身
 * public StringBuilder reverse()        将对象的内容反转
 * public int length()                   返回对象内容长度
 * public String toString()              通过toString()就可以实现把StringBuilder转换为String
 *
 */

/**
 * 为啥操作字符串建议使用StringBuilder，而不用原来学过的String??
 * 对于字符串相关的操作，如频繁的拼接、修改等，建议用StringBuidler，效率更高!
 * 注意：如果操作字符串较少，或者不需要操作，以及定义字符串变量，还是建议用String。
 *
 * 注意：
 * StringBuffer的用法与StringBuilder是一模一样的
 * 但 StringBuilder是线程不安全的  StringBuffer是线程安全的
 *
 * 1、为什么对于字符串相关的操作，如频繁的拼接、修改等，建议用StringBuidler？
 * String 是不可变字符串、频繁操作字符串会产生很多无用对象，性能差。
 * StringBuilder：是内容可变的字符串、拼接字符串性能好、代码优雅。
 * 注意：如果操作字符串较少，或者不需要操作，以及定义字符串时，则用String。
 */

public class Test1 {
    public static void main(String[] args) {
        // 目标：搞清楚StringBuilder的用法和作用。 StringBuilder的无参构造器和有参构造器
        StringBuilder s1 = new StringBuilder(); // s ""
        StringBuilder s = new StringBuilder("itheima"); // s "itheima"

        // 1、拼接内容
        s.append(12);
        s.append("黑马");
        s.append(true);
        System.out.println(s);
        //s1.append(new Test1());
        //s1.append(new int[3]);
        s1.append("TMD总是上纲上线吵架，提供建议就是否定，真TM头炸，三观不和吗");
        System.out.println("s1是： "+s1);  //输出的是字符串内容，因为StringBuilder的内部重写了tostring方法

        System.out.println("=========链式编程========");

        // 看append源码，返回了一个“this”，所以支持链式编程
        s.append(666).append("黑马2").append(666);
        System.out.println("s是： "+s);
        System.out.println(s.append(777));

        System.out.println("========反转方法=======");

        // 2、反转操作
        s.reverse();   //底层源码返回的也是this
        System.out.println("s调用reverse方法： "+s);
        System.out.println("s1调用reverse方法: "+s1.reverse());

        // 3、返回字符串的长度
        System.out.println("字符串长度，length方法： "+s.length());

        // 4、把StringBuilder对象又转换成String类型。
        String rs = s.toString();
        System.out.println("把StringBuilder对象s又转换成String类型: "+rs);
    }
}
